/*
 * Copyright (c) 2000-2003 Yale University. All rights reserved. THIS SOFTWARE IS PROVIDED "AS IS," AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE EXPRESSLY DISCLAIMED.
 * IN NO EVENT SHALL YALE UNIVERSITY OR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED, THE COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED IN ADVANCE OF THE POSSIBILITY OF SUCH DAMAGE.
 * Redistribution and use of this software in source or binary forms, with or without modification, are permitted, provided that the
 * following conditions are met: 1. Any redistribution must include the above copyright notice and disclaimer and this list of conditions in
 * any related documentation and, if feasible, in the redistributed software. 2. Any redistribution must include the acknowledgment, "This
 * product includes software developed by Yale University," in any related documentation and, if feasible, in the redistributed software. 3.
 * The names "Yale" and "Yale University" must not be used to endorse or promote products derived from this software.
 */

package com.phevos.web.cas.client.taglib;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * <p>
 * Logout tag for use with the Yale Central Authentication Service. Clears the indicated attribute and, if 'scope' is 'session', also
 * invalidates the session. Finally, redirects to CAS's logout URL.
 * </p>
 * 
 * @author Shawn Bayern
 */
public class LogoutTag extends TagSupport
{

    // *********************************************************************
    // Internal state

    /**
     * 
     */
    private static final long serialVersionUID = -1763131586758619464L;

    private String var; // tag attribute

    private String logoutUrl; // tag attribute

    private int scope; // tag attribute

    /**
     * validate
     * 
     * @return int
     * @throws JspException
     */
    public int doStartTag() throws JspException
    {
        try
        {

            // retrieve the response object
            HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();

            // kill the authentication information
            pageContext.removeAttribute(var, scope);

            // if scope is SESSION_SCOPE, invalidate the session
            if (scope == PageContext.SESSION_SCOPE)
                pageContext.getSession().invalidate();

            // send the redirect
            response.sendRedirect(logoutUrl);

            return SKIP_BODY;

        }
        catch (IOException ex)
        {
            throw new JspTagException(ex.getMessage());
        }
    }

    /**
     * doEndTag
     * 
     * @return int
     */
    public int doEndTag()
    {
        return SKIP_PAGE;
    }

    /**
     * @param var String
     */
    public void setVar(String var)
    {
        this.var = var;
    }

    /**
     * setScope
     * 
     * @param scope String
     */
    public void setScope(String scope)
    {
        if (scope.equals("page"))
            this.scope = PageContext.PAGE_SCOPE;
        else if (scope.equals("request"))
            this.scope = PageContext.REQUEST_SCOPE;
        else if (scope.equals("session"))
            this.scope = PageContext.SESSION_SCOPE;
        else if (scope.equals("application"))
            this.scope = PageContext.APPLICATION_SCOPE;
        else
            throw new IllegalArgumentException("invalid scope");
    }

    /**
     * setLogoutUrl
     * 
     * @param logoutUrl String
     */
    public void setLogoutUrl(String logoutUrl)
    {
        this.logoutUrl = logoutUrl;
    }

    // *********************************************************************
    // Constructor and lifecycle management
    /**
     * LogoutTag
     */
    public LogoutTag()
    {
        super();
        init();
    }

    // Releases any resources we may have (or inherit)
    /**
     * release
     */
    public void release()
    {
        super.release();
        init();
    }

    // clears any internal state we might have
    /**
     * init
     */
    private void init()
    {
        var = logoutUrl = null;
        scope = PageContext.PAGE_SCOPE;
    }
}
